package com.ywyself.common;

import com.jfinal.config.*;
import com.jfinal.core.JFinal;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.template.Engine;
import com.ywyself.common.pool.DataLoad;
import com.ywyself.common.pool.DataPool;
import com.ywyself.common.routes.AdminRoutes;
import com.ywyself.common.routes.ApiRoutes;
import com.ywyself.common.routes.FrontRoutes;
import com.ywyself.controller.ToolsController;
import com.ywyself.controller.api.douban.v2.movie.MovieController;
import com.ywyself.controller.handler.SiteAccessHandler;
import com.ywyself.controller.handler.WebResourceHandler;
import com.ywyself.model._MappingKit;

public class YsConfig extends JFinalConfig {
    public static final String BASE_UPLOAD = "/upload";
    /**
     * 图片的上传路径，BASE_UPLOAD+/image
     */
    public static final String upload_image = "/image";
    /**
     * 后台页面基本路径
     */
    public static final String BACK_STAGE = "/backStage";
    /**
     * 管理后台网址路径
     */
    public static final String ADMIN_URL = "/admin";

    /**
     * 运行此 main 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
     * <p>
     * 使用本方法启动过第一次以后，会在开发工具的 debug、run config 中自动生成
     * 一条启动配置，可对该自动生成的配置再添加额外的配置项，例如 VM argument 可配置为： -XX:PermSize=64M
     * -XX:MaxPermSize=256M
     */
    public static void main(String[] args) {
        JFinal.start("WebRoot", 80, "/");
    }

    /**
     * 配置常量
     */
    public void configConstant(Constants me) {
        DataLoad.loadPropKit();
        // 设置为开发模式
        me.setDevMode(PropKit.getBoolean("devMode", true));
        // 这里设置的文件在系统的基本路径
        // me.setBaseUploadPath(YsConfig.BASE_UPLOAD);
    }

    /**
     * 配置路由
     */
    public void configRoute(Routes me) {
        // 后端路由
        me.add(new AdminRoutes());
        // 前端路由
        me.add(new FrontRoutes());
        // api路由
        me.add(new ApiRoutes());
        // 其他
        me.add("/tools", ToolsController.class);
        // 豆瓣
        me.add("/douban/v2/movie", MovieController.class);
    }

    public void configEngine(Engine me) {
        /*
         * 将路径映射添加为 shared object 扩展，可以直接在页面上进行使用，无需每次都注入值
         */
        me.addSharedObject("dp", new DataPool());
        // 设置后台文件基本路径
        me.addSharedObject("backStage", YsConfig.BACK_STAGE);
        // 管理后台网络地址
        me.addSharedObject("adminRoot", YsConfig.ADMIN_URL);
        // 修改#date指令的默认日期显示格式
        me.setDatePattern("yyy-MM-dd HH:mm");
        // 加载模板
        LoadEngine.addEngine(me);
    }

    private static DruidPlugin createDruidPlugin() {
        String url = PropKit.get("datasource.url");
        String user = PropKit.get("datasource.user");
        String password = PropKit.get("datasource.password");
        return new DruidPlugin(url, user.trim(), password.trim());
    }

    private static RedisPlugin createRedisPlugin() {
        String url = PropKit.get("redis.url", "192.168.0.7");
        int port = PropKit.getInt("redis.port");
        String password = PropKit.get("redis.password", "123456");
        return new RedisPlugin("redisCache", url, port, password);
    }

    /**
     * 配置插件
     */
    public void configPlugin(Plugins me) {
        /*
         * 配置C3p0数据库连接池插件,配置ActiveRecord插件
         */
        DruidPlugin druidPlugin = createDruidPlugin();
        me.add(druidPlugin);
        // 配置ActiveRecord插件
        ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
        // sql管理与动态生成
        activeRecordPlugin.setBaseSqlTemplatePath(PathKit.getRootClassPath() + "/sql");
        activeRecordPlugin.addSqlTemplate("all.sql");
        // 所有映射在 MappingKit 中自动化搞定
        _MappingKit.mapping(activeRecordPlugin);
        me.add(activeRecordPlugin);
        /*
         * 配置任务调度插件
         */
        Cron4jPlugin cron4jPlugin = new Cron4jPlugin("task.test.txt", "cron4j");
        me.add(cron4jPlugin);
    }

    /**
     * 配置全局拦截器
     */
    public void configInterceptor(Interceptors me) {
    }

    /**
     * 配置处理器
     */
    public void configHandler(Handlers me) {
        me.add(new SiteAccessHandler());
        me.add(new WebResourceHandler());
    }

    /**
     * 启动后执行
     */
    public void afterJFinalStart() {
        // 加载网站信息
        DataLoad.loadSiteConfig();
    }
}
